// const BASE_URL = "http://localhost:597/vm-api/";
const BASE_URL = "https://jinjin.cloud/vm-api/";

import { showConfirm } from './dialog';

let isDialogShowing = false; // 全局防抖

export function request(options) {
  return new Promise((resolve, reject) => {
    wx.request({
      url: BASE_URL + options.url,
      method: options.method || "GET",
      data: options.data || {},
      header: {
        "Content-Type": "application/json",
        "Token": wx.getStorageSync("token") || "",
        ...options.header,
      },
      success(res) {
        if (res.statusCode === 401) {
          // 执行重新登录逻辑
          reLogin(options).then(() => {
            // 登录成功后重新发起原请求
            request(options).then(resolve).catch(reject);
          }).catch(err => {
            reject(err);
          });
          return;
        }


        const result = res.data;
        if (result.success) {
          resolve(result.data);
        } else {
          wx.showToast({
            title: result.msg || "请求失败",
            icon: "none",
            duration: 1000,
          });
          reject(result);
        }
      },
      fail(err) {
        wx.showToast({
          title: "网络异常，请稍后再试",
          icon: "none",
        });
        reject(err);
      },
      complete() {
        if (typeof options.complete === "function") {
          options.complete(); // 调用外部传进来的 complete
        }
      }
    });
  });
}

// 公用 reLogin.js
function reLogin(option) {
  const pageCtx = option.pageCtx;
  return new Promise((resolve, reject) => {
    wx.login({
      success(loginRes) {
        if (loginRes.code) {
          wx.request({
            url: BASE_URL + `user/login/${loginRes.code}`,
            method: "GET",
            success(res) {
              if (res.data && res.data.data) {
                wx.setStorageSync("token", res.data.data);
                resolve();
              } else {



                if (isDialogShowing) return reject(res.data);
                if (!pageCtx) {
                  console.error('pageCtx 未传入');
                  return reject(res.data);
                }
                isDialogShowing = true;
                showConfirm({
                  message: '您需先注册才可使用该产品的其他服务',
                  context: pageCtx
                })
                  .then(() => {
                    wx.navigateTo({
                      url: `/pages/register/register?redirect=${encodeURIComponent(option.redirect)}`
                    });
                  })
                  .catch(() => {
                    wx.switchTab({ url: '/pages/index/index' });
                  })
                  .finally(() => {
                    isDialogShowing = false;
                  });

                // if (pageCtx) {
                //   Dialog.confirm({
                //     message: '您需先注册才可使用该产品的其他服务',
                //     context: pageCtx
                //   })
                //     .then(() => {
                //       wx.navigateTo({
                //         url: `/pages/register/register?redirect=${encodeURIComponent(option.redirectUrl)}`,
                //       });
                //     })
                //     .catch((err) => {
                //       console.error('Dialog 出错：', err);
                //       wx.switchTab({
                //         url: '/pages/index/index',
                //       });
                //     });
                // }

              }
            },
            fail(err) {
              wx.showToast({ title: "登录失败，请检查网络", icon: "none" });
              reject(err);
            },
          });
        } else {
          reject(new Error("wx.login 未返回 code"));
        }
      },
      fail(err) {
        reject(err);
      },
    });
  });
}

export function getOpenid() {
  return new Promise((resolve, reject) => {
    // 1. 先从本地存储中获取
    const storedOpenid = wx.getStorageSync('openid');

    if (storedOpenid) {
      // 本地有存储，直接返回
      resolve(storedOpenid);
      return;
    }

    // 2. 本地没有，调用wx.login获取code
    wx.login({
      success: (res) => {
        if (res.code) {
          // 3. 调用后端接口换取openid
          wx.request({
            url: BASE_URL + `user/code/${res.code}`,
            method: 'GET',
            data: {
              code: res.code
            },
            success: (response) => {
              if (response.data.data) {
                // 4. 获取成功后存储到本地
                wx.setStorageSync('openid', response.data.data);
                resolve(response.data.data);
              }
            },
            fail: (err) => {
              reject('接口请求失败: ' + err.errMsg);
            }
          });
        } else {
          reject('登录失败: ' + res.errMsg);
        }
      },
      fail: (err) => {
        reject('wx.login调用失败: ' + err.errMsg);
      }
    });
  });
}

// 清除本地存储的openid（用于登出等场景）
function clearOpenid() {
  wx.removeStorageSync('openid');
}